package sto.android.app;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.device.DeviceManager;
import android.device.ScanManager;
import android.device.scanner.configuration.PropertyID;
import android.net.Uri;
import android.util.Log;

import java.io.File;

/**Created by lenovo on 2016/4/29<br/>
 * 提示：<br/>
 * 1.必须调用close()进行释放<br/>
 */
public class UboxunJNI implements StoJNI {

    private static UboxunJNI uboxunJNI;

    private final String SCAN_ACTION = "urovo.rcv.message";
    private final String Extra_BarcodeType = "barcodeType";
    private final String Extra_Barcode = "barocode";
    private final String Extra_Length = "length";
    private ScanManager scanMgr;
    private DeviceManager dvcMgr;
    private BroadcastReceiver receiver;
    private Context ctx;
    private String charset;
    private ScanCallBack scanCallback;
//    Stojni Sto_jni;
    private boolean start_scan_flag = false;
    public  UrovoScan urovoScan;// 扫描辅助类
//    boolean isContinueScan = false;// 是否开启连续扫描

    public UboxunJNI(Context ctx) {
        this.scanMgr = new ScanManager();
        this.dvcMgr = new DeviceManager();
        this.receiver = new ScanDataReceiver();
        this.charset = "UTF-8";
        this.ctx = ctx;
        this.scanMgr.switchOutputMode(0);
//        Sto_jni=new Stojni();
        IntentFilter filter = new IntentFilter();
        filter.addAction(SCAN_ACTION);
        this.ctx.registerReceiver(receiver, filter);
        urovoScan =  new UrovoScan(new UrovoScan.ScanListener() {
            @Override
            public void onScan(String barcode) {
//				if (BusinessOperHelper.alert != null) {
//					BusinessOperHelper.alert.dismiss();
//					BusinessOperHelper.alert = null;
//				}
//				if (barcode != null) {
//					barcode = barcode.trim();
//				}
                if(scanCallback != null) {
                    scanCallback.onScanResults(barcode, 0);
                    scanCallback.onScanResults(barcode);
                }
            }
        });
//        isContinueScan = true;
    }
    //onresume
    public void startScanContinue(){
        urovoScan.isContinuousMode = false;
        urovoScan.switchTriggerMode();
    }

//    public void switchScanContinue(){
//        urovoScan.switchTriggerMode();
//    }
    // onpause
    public void endScanContinue(){
        urovoScan.isContinuousMode = true;
        urovoScan.switchTriggerMode();
    }

    public static synchronized UboxunJNI getInstance(Context context) {
        if (uboxunJNI == null) {
            uboxunJNI = new UboxunJNI(context);
        }
        return uboxunJNI;
    }

    /**对扫描到的条码，用指定的字符集解析
     * @param charset
     */
    public void SetScannerCharset(String charset) {
        this.charset = charset;
    }

    @Override
    public int getPlatform() {
        return 0;
    }

    @Override
    public String getJniVer() {
        return null;
    }

    public int getEventFuction(int keycode) {
        Log.d("Ubox", "######" + keycode + "getEventFunction");
        if(keycode==140){
            return 110;
        }
        return keycode;
//        switch(keycode) {
//            case 3:
//                return 3;
//            case 4:
//                return 4;
//            case 5:
//                return 5;
//            case 6:
//                return 6;
//            case 7:
//                return 7;
//            case 8:
//                return 8;
//            case 9:
//                return 9;
//            case 10:
//                return 10;
//            case 11:
//                return 11;
//            case 12:
//                return 12;
//            case 13:
//                return 13;
//            case 14:
//                return 14;
//            case 15:
//                return 15;
//            case 16:
//                return 16;
//            case 19:
//                return 19;
//            case 20:
//                return 20;
//            case 21:
//                return 21;
//            case 22:
//                return 22;
//            case 24:
//                return 134;
//            case 25:
//                return 133;
//            case 56:
//                return 17;
//            case 61:
//                return 61;
//            case 66:
//                return 66;
//            case 67:
//                return 67;
//            case 69:
//                return 18;
//            case 82:
//                return 82;
//            case 131:
//                return 131;
//            case 132:
//                return 132;
//            case 136:
//                return 140;
//            case 139:
//            case 140:
//            case 141:
//                return 110;
//            default:
//                return 0;
//        }
    }


    @Override
    public String getPdaBrand() {
        return "urovo";
    }

    /**
     * 设置回调接口
     *
     * @param mScanCB
     */
    @Override
    public void setmScanCB(ScanCallBack mScanCB) {
        this.scanCallback = mScanCB;
    }

    @Override
    public void SetGPIOStatusJNI(int var1, int var2) {

    }

    /**关闭UrovoDevice，释放资源
     */
    public void Close() {
        ctx.unregisterReceiver(receiver);
        scanMgr = null;
        dvcMgr = null;
        receiver = null;
        ctx = null;
    }

    @Override
    public void SetScannerOn() {
        scanMgr.openScanner();
//        Sto_jni.SetScannerOn();
    }

    @Override
    public void SetScannerStart() {
//        scanMgr.stopDecode();
//            try{
//                if(!start_scan_flag){
//                    scanMgr.startDecode();
//                    start_scan_flag = true;
//                }
//            }
//        catch(Exception e){
//            e.printStackTrace();
//        }
    startScanContinue();
    }


    @Override
    public void SetScannerStop() {
//        start_scan_flag = false;
//        scanMgr.stopDecode();
        endScanContinue();
    }

    @Override
    public void SetScannerOff() {
        scanMgr.closeScanner();
//        Sto_jni.SetScannerOff();
    }

    @Override
    public int SetScannerPara(int para, int value) {
//        return scanMgr.setParameterInts(new int[]{para}, new int[]{value});
//        return  Sto_jni.SetScannerPara(para,value);
        return 0;
    }

    @Override
    public String SetScannerPara(String para, String value) {
        //TODO 暂时无法实现
//     return   Sto_jni.SetScannerPara(para,value);
//       return null;
        return "";
    }

    @Override
    public int GetScannerPara(int para) {
//        int[] result = scanMgr.getParameterInts(new int[]{para});
//        if(result != null && result.length > 0) {
//            return result[0];
//        }
//        else {
//            return -1;
//        }
//        return Sto_jni.GetScannerPara(para);
        return 0;
    }

    /**
     *
     * 获取扫描头参数
     */
    @Override
    public String GetScannerPara(String para) {
        //TODO 暂时无法实现
//        return null;
//        return Sto_jni.GetScannerPara(para);
        return "";
    }

    @Override
    public void SetScannerRetriger() {
        SetScannerStart();
//         Sto_jni.SetScannerRetriger();
    }


    /**设置扫描超时时间（1-9秒）
     * @param sec 单位为秒
     */
    @Override
    public void SetScannerTimerOut(int sec) {
//        Sto_jni.SetScannerTimerOut(sec);
        if(sec < 1 || sec  > 20) {
            sec = 3;
        }
        scanMgr.setParameterInts(new int[]{PropertyID.LASER_ON_TIME}, new int[]{sec * 10});
    }

    @Override
    public int getmScanModel() {
//        return MODEL_SE955;
//        Sto_jni.
//       return  Sto_jni.getmScanModel();
        return 0;
    }

    @Override
    public boolean GetScannerIsScanning() {
        //TODO 暂时无法实现
//        return Sto_jni.GetScannerIsScanning();
//        if(start_scan_flag){
//            return false;
//        }
        return start_scan_flag;
//        return true;
    }

//    @Override
    public void SetGPIOStatus(int gpio, int status) {
//        Sto_jni.SetGPIOStatus(gpio,status);
    }

    /**
     * 系统重启
     */
    @Override
    public void SetSystemReboot() {
//        Sto_jni.SetSystemReboot();
    }

    /**
     * 系统关机
     */
    @Override
    public void SetSystemShutdown() {
//        Sto_jni.SetSystemShutdown();
    }

    @Override
    public void SetSystemTime(String mm) {
//        Sto_jni.SetSystemTime(mm);
        dvcMgr.setCurrentTime(Long.valueOf(mm).longValue());
    }

    /**
     * 设置机唯一码（暂不实现）
     */
    @Override
    public void SetMachineCode(String code) {
//        Sto_jni.SetMachineCode(code);
    }

    /**
     * 获取唯一码
     */
    @Override
    public String GetMachineCode() {
        String dvcID = "5"+dvcMgr.getDeviceId();
        return dvcID;
    }

    /**
     * 屏蔽物理按键(扫描键除外)
     */
    @Override
    public void disableKeypad() {
//        Sto_jni.disableKeypad();
    }

    /**
     * 自定义屏蔽物理按键参数String：要屏蔽的按键 以逗号隔开
     * 例如屏蔽menu键和方向上键
     * eg："+android.view.KeyEvent.KEYCODE_MENU+","+android.view.KeyEvent.KEYCODE_DPAD_UP+"
     */
    @Override
    public void disableKeypadEnableCustom(String customstr) {
//        Sto_jni.disableKeypadEnableCustom(customstr);
    }

    /**
     * 使能物理按键（所有按键）
     */
    @Override
    public void enableKeypad() {
//        Sto_jni.enableKeypad();
    }

    /**
     *使能物理按键音
     */
    @Override
    public void enableKeydownTone() {
//        Sto_jni.enableKeydownTone();
    }

    /**
     * 获取物理按键音状态
     */
    @Override
    public int GetStatusKeydownTone() {
//        return Sto_jni.GetStatusKeydownTone();
        return 0;
    }

    /**
     * 关闭物理按键音
     */
    @Override
    public void disableKeydownTone() {
//        Sto_jni.disableKeydownTone();
    }

    private boolean isStatusBarExpand = true;

    @Override
    public void TurnOnStatusBarExpand() {
        dvcMgr.enableStatusBar(true);
        isStatusBarExpand = true;
//        Sto_jni.TurnOnStatusBarExpand();
    }

    @Override
    public void TurnOffStatusBarExpand() {
        dvcMgr.enableStatusBar(false);
        isStatusBarExpand = false;
//        Sto_jni.TurnOffStatusBarExpand();
    }

    /**
     * 获取状态栏是否可下拉
     */
    @Override
    public int GetStatusBarExpand() {
//       return  Sto_jni.GetStatusBarExpand();
        if(isStatusBarExpand){
            return 1;
        }
        return 0;
    }

    /**
     * 使能usb debug
     * 说明：打开usb调试功能
     */
    @Override
    public void TurnOnUSBDebug() {
//        Sto_jni.TurnOnUSBDebug();
    }

    /**
     * 屏蔽USB debug
     * 说明：关闭usb调试功能
     */
    @Override
    public void TurnOffUSBDebug() {
//        Sto_jni.TurnOffUSBDebug();
    }

    /**
     * 获取USB debug开启状态
     */
    @Override
    public int GetStatusUSBDebug() {
//        return Sto_jni.GetStatusUSBDebug();
        return 0;
    }

    /**
     * 使能安装APK（暂不实现）
     * 说明：允许安装第三方apk
     */
    @Override
    public void TurnOnInstallManager() {
//         Sto_jni.TurnOnInstallManager();
    }

    /**
     * 屏蔽安装APK（暂不实现）
     * 说明：不允许安装第三方apk
     */
    @Override
    public void TurnOffInstallManager() {
//        Sto_jni.TurnOffInstallManager();
    }

    /**
     * 获取是否屏蔽安装APK（暂不实现）
     */
    @Override
    public int GetStatusInstallManager() {
        return 0;
    }

    /**
     * 使能触摸解锁
     * 说明：恢复触摸解锁
     */
    @Override
    public void TurnOnScreenLock() {
//        Sto_jni.TurnOnScreenLock();
    }

    /**
     * 禁止触摸解锁
     * 说明：待机唤醒不需要触摸解锁
     */
    @Override
    public void TurnOffScreenLock() {
//        Sto_jni.TurnOffScreenLock();
    }

    /**
     * 获取屏幕是否能触摸
     * @return 1 使能解锁， 0禁止解锁
     */
    @Override
    public int GetStatusScreenLock() {
//        return Sto_jni.GetStatusScreenLock();
        return 0;
    }


    /**
     * 配置唤醒源（暂不实现）
     * @return 1 电源键唤醒	0 任意键唤醒
     */
    @Override
    public int GetStatusWakeUp() {
//        return Sto_jni.GetStatusWakeUp();
        return 0;
    }

    /**
     * 配置电源键唤醒（暂不实现）
     */
    @Override
    public void CfgPowerKeyWakeUp() {
//         Sto_jni.CfgPowerKeyWakeUp();
    }

    /**
     * 配置任意按键唤醒（暂不实现）
     */
    @Override
    public void CfgAnyKeyWakeUp() {
//        Sto_jni.CfgAnyKeyWakeUp();
    }

    /**
     * 使能触摸屏
     * 说明：恢复触摸屏触摸功能
     */
    @Override
    public void Enable_touch_screen() {
//        Sto_jni.Enable_touch_screen();
    }

    /**
     * 禁止使用触摸屏
     * 说明：触摸屏去掉触摸功能
     */
    @Override
    public void Disable_touch_screen() {
//        Sto_jni.Disable_touch_screen();
    }

    /**
     * 获取触摸屏是否能触摸
     */
    @Override
    public int GetStatusTouch_screen() {
//        return Sto_jni.GetStatusTouch_screen();
        return 0;
    }

    /**
     * 静默安装apk
     * @param apkPath	为文件路径,请确保路径及文件的完整性;
     * @param runAfterFinished 为true时,Apk安装完成之后会自动运行;为false时,Apk安装完成之后不运行
     */
    @Override
    public void StoJNI_InstallApkWithSilence(String apkPath, boolean runAfterFinished) {
//        Sto_jni.StoJNI_InstallApkWithSilence(apkPath,runAfterFinished);
        String apkFilePath = "data/data/com.urovo.stkd/files/stkd.apk";

       File apkfile = new File(apkFilePath);
        String cmd3 = "chmod 777 " + apkfile.getAbsolutePath();
        String cmd4 = "chmod 777 " + apkfile.getParent();
        try {
            Runtime.getRuntime().exec(cmd4);
            Runtime.getRuntime().exec(cmd3);
        }
        catch (Exception e) {
            e.printStackTrace();
//            MyApplication.loger.error("[installApk]" + e.getMessage());
        }
        Uri uri = Uri.fromFile(apkfile);
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setDataAndType(uri, "application/vnd.android.package-archive");
        ctx.startActivity(intent);
    }

    /**
     * 开关gps
     */
    @Override
    public void TurnOnOffGPS(boolean set) {
//        Sto_jni.TurnOnOffGPS(set);
    }

    /**
     * 屏蔽 / 使能 浏览器访问
     */
    @Override
    public void TurnOnOffBrowser(boolean set) {
//        Sto_jni.TurnOnOffBrowser(set);
    }

    /**
     * 使用触摸屏Home键
     * 说明：恢复触摸屏Home键触摸功能
     */
    @Override
    public void Enable_home_touch_screen() {
//        Sto_jni.Enable_home_touch_screen();
        Intent intent = new Intent();
        intent.setAction("android.intent.action.HOME_LOCK_FLAG");
        intent.putExtra("lock_flag", true);
        ctx.sendBroadcast(intent);
    }

    /**
     * 禁止使用触摸屏Home键
     * 说明：触摸屏去掉Home键触摸功能
     */
    @Override
    public void Disable_home_touch_screen() {
//        Sto_jni.Disable_home_touch_screen();
        Intent intent = new Intent();
        intent.setAction("android.intent.action.HOME_LOCK_FLAG");
        intent.putExtra("lock_flag", false);
        ctx.sendBroadcast(intent);
    }

    /**
     * 触摸屏Home键开关，获取触摸屏上Home键的状态
     * @return 1开，0 关
     */
    @Override
    public int GetStatusTouch_Home_screen() {
        return 0;
//        return  Sto_jni.GetStatusTouch_Home_screen();
    }

    /**
     * 使用触摸屏MENU键（暂不实现）
     * 说明：恢复触摸屏MENU键触摸功能
     */
    @Override
    public void Enable_menu_touch_screen() {
//        Sto_jni.Enable_menu_touch_screen();
    }

    /**
     * 禁止使用触摸屏menu键（暂不实现）
     * 说明：触摸屏去掉menu键触摸功能
     */
    @Override
    public void Disable_menu_touch_screen() {
//        Sto_jni.Disable_menu_touch_screen();
    }

    /**
     * 触摸屏Menu键开关，获取触摸屏上menu键的状态（暂不实现）
     */
    @Override
    public int GetStatusTouch_Menu_screen() {
        return 0;
//        return Sto_jni.GetStatusTouch_Menu_screen();
    }

    /**
     * 使用触摸屏BACK键（暂不实现）
     * 说明：恢复触摸屏BACK键触摸功能
     */
    @Override
    public void Enable_back_touch_screen() {
//        Sto_jni.Enable_back_touch_screen;
//        Sto_jni.Enable_back_touch_screen();
    }

    /**
     * 禁止使用触摸屏back键（暂不实现）
     * 说明：触摸屏去掉back键触摸功能
     */
    @Override
    public void Disable_back_touch_screen() {
//        Sto_jni.Disable_back_touch_screen();
    }

    /**
     * 触摸屏Back键开关，获取触摸屏上back键的状态（暂不实现）
     */
    @Override
    public int GetStatusTouch_Back_screen() {
//        return Sto_jni.GetStatusTouch_Back_screen();
        return 0;
    }

    private class ScanDataReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if(SCAN_ACTION.equals(intent.getAction())) {
                byte barcodeType = intent.getByteExtra(Extra_BarcodeType,(byte) 0);
                byte[] barcode = intent.getByteArrayExtra(Extra_Barcode);
                int barocodelen = intent.getIntExtra(Extra_Length,0);
                try {
                    String barcodeStr = new String(barcode, 0, barocodelen, charset);
                    if(scanCallback != null) {
                        scanCallback.onScanResults(barcodeStr, barcodeType);
                        scanCallback.onScanResults(barcodeStr);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }


}
